package com.atdel.demo08;

import java.io.*;

/**
 * @BelongsProject: java_study
 * @BelongsPackage: com.atdel.demo08
 * @Author: Del
 * @CreateTime: 2025-03-07  15:47
 * @Description:
 * 案例：
 * 作业：编写一个Java程序，创建一个守护线程和一个用户线程，用户线程实现文件的拷贝，
 * 而守护线程实现打印输出拷贝进度（每隔500毫秒输出一下进度）
 * @Version: 1.0
 */
public class CopyThreadTest {
    public static void main(String[] args) {
        String src = "D://王睿卓 - 大山 (Live版).ncm"; // 源文件路径
        String dest = "destination.txt"; // 目标文件路径

        CopyThread copyThread = new CopyThread(src, dest);
        ProgressThread progressThread = new ProgressThread(copyThread);

        // 设置进度线程为守护线程
        progressThread.setDaemon(true);

        // 启动线程
        copyThread.start();
        progressThread.start();

        // 等待拷贝线程完成
        try {
            copyThread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 确保输出 100% 和“拷贝完成！”
        System.out.println("拷贝进度: 100.00%");
        System.out.println("拷贝完成！");
    }
}

class CopyThread extends Thread {
    // 拷贝源文件
    private String src;
    // 拷贝目标文件
    private String dest;
    // 已拷贝的字节数
    private long copiedBytes = 0;
    // 文件总字节数
    private long totalBytes = 0;



    public CopyThread(String src, String dest) {
        this.src = src;
        this.dest = dest;
    }



    @Override
    public void run() {
        // 通过try-with-resources自动关闭资源
        try (FileInputStream fis = new FileInputStream(src);
             FileOutputStream fos = new FileOutputStream(dest)) {
            // 获取文件总字节数
            totalBytes = fis.getChannel().size();
            // 创建缓冲区
            byte[] buffer = new byte[8092];
            // 读取文件
            int bytesRead;
            // 循环读取文件
            while ((bytesRead = fis.read(buffer)) != -1) {
                fos.write(buffer, 0, bytesRead);
                copiedBytes += bytesRead;
                // 模拟耗时操作
                Thread.sleep(1);
            }
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }

    public long getCopiedBytes() {
        return copiedBytes;
    }

    public long getTotalBytes() {
        return totalBytes;
    }
}

class ProgressThread extends Thread {
    private CopyThread copyThread;

    public ProgressThread(CopyThread copyThread) {
        this.copyThread = copyThread;
    }

    @Override
    public void run() {
        while (copyThread.isAlive()) { // 拷贝线程未完成时持续输出进度
            try {
                // 获取已拷贝的字节数和总字节数
                long copiedBytes = copyThread.getCopiedBytes();
                long totalBytes = copyThread.getTotalBytes();
                // 判断是否已经拷贝了任何字节，如果没有拷贝任何字节则跳过循环
                if (totalBytes == 0 || copiedBytes == 0) {
                    continue;
                }
                // 通过已经拷贝的字节数和总字节数计算出进度
                double progress = (double) copiedBytes / totalBytes * 100;
                clearConsole02(); // 清屏
                System.out.printf("拷贝进度: %.2f%%\n", progress);
                Thread.sleep(50); // 每隔500毫秒输出一次进度
            } catch (InterruptedException e) {
                break;
            }
        }
    }

    private void clearConsole01() {
        // 打印 50 个空行模拟清屏
        for (int i = 0; i < 50; i++) {
            System.out.println();
        }
    }

    private void clearConsole02() {
        try {
            // 使用 ANSI 控制字符清屏
            System.out.print("\033[H\033[2J");
            System.out.flush();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


}
